package com.hejing.初识集合框架;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * ClassName: CollectionTest
 * Package: com.hejing.初识集合框架
 * Description:
 *      测试 Collection 种方法的使用
 * @Author: HeJing
 * @Create: 2023-04-22 23:16
 * @Version: 1.0
 */
public class CollectionTest {

    /**
     *  (1) add(Object obj): 添加元素到当前集合中
     *  (2) addAll(Collection other)： 添加other集合中的所有元素到当前集合中。 也即: this = this U other
     *
     */
    @Test
    public void test01(){
        Collection coll = new ArrayList();

        // add(Object obj)
        coll.add("ads");
        coll.add(true);
        coll.add(new Object());
        coll.add(new Person("liqing", 23));
        System.out.println(coll);

        Collection coll01 = new ArrayList();
        coll01.add("你好世界");
        coll01.add(new Person("立青", 23));

        System.out.println(coll01);
        coll01.addAll(coll);
        System.out.println(coll01);
    }

    /**
     * (3) int size(): 获取当前集合中实际存储的元素个数
     * (4) boolean isEmpty(): 判断当前集合是否为空集合
     * (5) boolean contains(Object obj): 判断当前集合中是否存在一个与obj对象equals返回true的元素
     * (6) boolean containsAll(Collection coll): 判断coll集合中的元素是否在当前集合中都存在，也即coll集合是否包含于当前集合
     * (7) boolean equals(Object obj): 判断当前集合与obj是否相等。
     */
    @Test
    public void test02(){

        Collection coll = new ArrayList();
        coll.add("AA");
        coll.add("BB");
        coll.add("CC");
        coll.add(true);
        coll.add(new Person("赵雷", 32));

        // size()
        System.out.println("the size of the coll is: " + coll.size());

        // isEmpty()
        System.out.println(coll.isEmpty());

        // contains():
        // contains(): 调用equals()方法，如果遇到自定义类型，需要重写equals()方法
        System.out.println(coll.contains("AA"));  // true
        System.out.println(coll.contains(new Person("赵雷", 32)));  // false

        // containsAll():
        Collection coll01 = new ArrayList();
        coll01.add("AA");
        coll01.add("CC");
        System.out.println(coll.containsAll(coll01));  // true

    }

    /**
     * (8) void clear(): 清空集合元素
     * (9) boolean remove(Object obj): 从当前集合中删除第一个找到的与obj对象返回true的元素
     * (10) boolean removeAll(Collection coll): 从当前集合中删除所有与coll集合中相同的元素，也即this = this - other
     * (11) boolean retainAll(Collection coll): 从当前集合中删除两个集合中不同的元素，使得当前集合仅仅保留与coll相同的元素。
     */
    @Test
    public void test03(){

        Collection coll = new ArrayList();
        coll.add("AA");
        coll.add("BB");
        coll.add("CC");
        coll.add(true);
        coll.add(new Person("赵雷", 32));

        System.out.println(coll);

        // remove(Object obj)
        coll.remove("AA");
        System.out.println(coll);

        Collection coll01 = new ArrayList();
        coll01.add("BB");
        coll01.add(true);
        // removeAll(Collection coll)
        coll.removeAll(coll01);
        System.out.println(coll);

        // retainAll(Collection all)
        Collection coll02 = new ArrayList();
        coll02.add("CC");
        coll02.add(new Person("赵雷", 32));
        coll.retainAll(coll02);
        System.out.println(coll);

        coll.clear();
        System.out.println(coll.size()); // 0
    }

    /**
     * (12) Object[] toArray(): 返回包含当前集合中所有元素的数组
     * (13) hashCode(): 获取集合对象的哈希值
     * (14) iterator(): 返回迭代器对象，用于集合遍历。
     */
    @Test
    public void test04(){
        Collection coll = new ArrayList();
        coll.add("AA");
        coll.add("BB");
        coll.add("CC");
        coll.add(true);
        coll.add(new Person("赵雷", 32));

        // 集合 --> 数组 coll.toArray()
        Object[] arr = coll.toArray();
        System.out.println(Arrays.toString(arr));
        System.out.println(coll);

        // hashCode(): 获取集合对象的哈希值
        System.out.println(coll.hashCode());

        // iterator(): 获取迭代器对象，用于集合遍历。

    }
    
    @Test
    public void test05(){
        String[] arr = new String[] {"aa", "bb", "cc"};
        List list = Arrays.asList(arr);
        System.out.println(list);
        System.out.println(list.getClass());
    }

    @Test
    public void test06(){
        Integer[] arr = new Integer[]{1, 2, 3};
        List list1 = Arrays.asList(arr);
        System.out.println(list1.size());  // 3
        System.out.println(list1);

        // 注意，Arrays.asList(Object....objs)里面的参数是对象，如果传入的数组里面的元素是基本数据类型，那么此时生成的list元素
        // 是该数组的地址(传入对象)
        int[] arr2 = new int[]{1, 2, 3};
        List list2 = Arrays.asList(arr2);
        System.out.println(list2.size());  // 1
        System.out.println(list2);
    }
    
}

























